widget: Change templates to use closure functions
authorBenjamin Otte <otte@redhat.com>
Fri, 22 Nov 2019 05:54:52 +0000 (06:54 +0100)
committerBenjamin Otte <otte@redhat.com>
Fri, 22 Nov 2019 16:42:31 +0000 (17:42 +0100)
... instead of connect functions.

docs/reference/gtk/gtk4-sections.txt
gtk/gtkwidget.c
gtk/gtkwidget.h

index 522494a7a3ac9ecc99a8bbd976a2887b7100a611..c53dfe8c605e42bc9ecc2c89a0a35512d4dc71f5 100644 (file)
@@ -4669,7 +4669,7 @@ gtk_widget_class_bind_template_child_internal_private
 gtk_widget_class_bind_template_child_full
 gtk_widget_class_bind_template_callback
 gtk_widget_class_bind_template_callback_full
-gtk_widget_class_set_connect_func
+gtk_widget_class_set_closure_func
 
 <SUBSECTION>
 gtk_widget_observe_children
index fcb683f050179311fe1837fa77b7840c0d1dfdeb..36d46e3ae48558722712f4fc8c388f88b1dc28c7 100644 (file)
@@ -490,9 +490,9 @@ typedef struct {
   GBytes               *data;
   GSList               *children;
   GSList               *callbacks;
-  GtkBuilderConnectFunc connect_func;
-  gpointer              connect_data;
-  GDestroyNotify        destroy_notify;
+  GtkBuilderClosureFunc closure_func;
+  gpointer              closure_data;
+  GDestroyNotify        closure_destroy;
 } GtkWidgetTemplate;
 
 struct _GtkWidgetClassPrivate
@@ -12027,9 +12027,9 @@ template_data_free (GtkWidgetTemplate *template_data)
       g_slist_free_full (template_data->children, (GDestroyNotify)template_child_class_free);
       g_slist_free_full (template_data->callbacks, (GDestroyNotify)callback_symbol_free);
 
-      if (template_data->connect_data &&
-         template_data->destroy_notify)
-       template_data->destroy_notify (template_data->connect_data);
+      if (template_data->closure_data &&
+         template_data->closure_destroy)
+       template_data->closure_destroy (template_data->closure_data);
 
       g_slice_free (GtkWidgetTemplate, template_data);
     }
@@ -12113,32 +12113,22 @@ setup_template_child (GtkWidgetTemplate   *template_data,
   return TRUE;
 }
 
-static void
-gtk_widget_template_connect_func (GtkBuilder    *builder,
-                                 GObject       *object,
-                                 const gchar   *signal_name,
-                                 const gchar   *handler_name,
-                                 GObject       *connect_object,
-                                 GConnectFlags  flags,
-                                 gpointer       user_data)
+static GClosure *
+gtk_widget_template_closure_func (GtkBuilder  *builder,
+                                  const char  *function_name,
+                                  gboolean     swapped,
+                                  GObject     *object,
+                                  gpointer     user_data,
+                                  GError     **error)
 {
-  GClosure *closure;
-  GError *error = NULL;
-
-  closure = gtk_builder_create_closure (builder,
-                                        handler_name,
-                                        flags & G_CONNECT_SWAPPED ? TRUE : FALSE,
-                                        connect_object ? connect_object : user_data,
-                                        &error);
-
-  if (error)
-    {
-      g_warning ("%s", error->message);
-      g_error_free (error);
-      return;
-    }
+  if (object == NULL)
+    object = user_data;
 
-  g_signal_connect_closure (object, signal_name, closure, flags & G_CONNECT_AFTER ? TRUE : FALSE);
+  return gtk_builder_create_cclosure (builder,
+                                      function_name,
+                                      swapped,
+                                      object,
+                                      error);
 }
 
 /**
@@ -12182,6 +12172,17 @@ gtk_widget_init_template (GtkWidget *widget)
 
   builder = gtk_builder_new ();
 
+  /* Setup closure handling. All signal data from a template receive the 
+   * template instance as user data automatically.
+   *
+   * A GtkBuilderClosureFunc can be provided to gtk_widget_class_set_signal_closure_func()
+   * in order for templates to be usable by bindings.
+   */
+  if (template->closure_func)
+    gtk_builder_set_closure_func (builder, template->closure_func, template->closure_data, NULL);
+  else
+    gtk_builder_set_closure_func (builder, gtk_widget_template_closure_func, widget, NULL);
+
   /* Add any callback symbols declared for this GType to the GtkBuilder namespace */
   for (l = template->callbacks; l; l = l->next)
     {
@@ -12231,16 +12232,7 @@ gtk_widget_init_template (GtkWidget *widget)
        }
     }
 
-  /* Connect signals. All signal data from a template receive the 
-   * template instance as user data automatically.
-   *
-   * A GtkBuilderConnectFunc can be provided to gtk_widget_class_set_signal_connect_func()
-   * in order for templates to be usable by bindings.
-   */
-  if (template->connect_func)
-    gtk_builder_connect_signals_full (builder, template->connect_func, template->connect_data);
-  else
-    gtk_builder_connect_signals_full (builder, gtk_widget_template_connect_func, widget);
+  gtk_builder_connect_signals (builder);
 
   g_object_unref (builder);
 }
@@ -12360,36 +12352,36 @@ gtk_widget_class_bind_template_callback_full (GtkWidgetClass *widget_class,
 }
 
 /**
- * gtk_widget_class_set_connect_func:
+ * gtk_widget_class_set_closure_func:
  * @widget_class: A #GtkWidgetClass
- * @connect_func: The #GtkBuilderConnectFunc to use when connecting signals in the class template
- * @connect_data: The data to pass to @connect_func
- * @connect_data_destroy: The #GDestroyNotify to free @connect_data, this will only be used at
+ * @closure_func: The #GtkBuilderClosureFunc to use when creating closure in the class template
+ * @closure_data: The data to pass to @closure_func
+ * @closure_data_destroy: The #GDestroyNotify to free @closure_data, this will only be used at
  *                        class finalization time, when no classes of type @widget_type are in use anymore.
  *
- * For use in language bindings, this will override the default #GtkBuilderConnectFunc to be
+ * For use in language bindings, this will override the default #GtkBuilderClosureFunc to be
  * used when parsing GtkBuilder XML from this class’s template data.
  *
  * Note that this must be called from a composite widget classes class
  * initializer after calling gtk_widget_class_set_template().
  */
 void
-gtk_widget_class_set_connect_func (GtkWidgetClass        *widget_class,
-                                  GtkBuilderConnectFunc  connect_func,
-                                  gpointer               connect_data,
-                                  GDestroyNotify         connect_data_destroy)
+gtk_widget_class_set_closure_func (GtkWidgetClass        *widget_class,
+                                  GtkBuilderClosureFunc  closure_func,
+                                  gpointer               closure_data,
+                                  GDestroyNotify         closure_data_destroy)
 {
   g_return_if_fail (GTK_IS_WIDGET_CLASS (widget_class));
   g_return_if_fail (widget_class->priv->template != NULL);
 
   /* Defensive, destroy any previously set data */
-  if (widget_class->priv->template->connect_data &&
-      widget_class->priv->template->destroy_notify)
-    widget_class->priv->template->destroy_notify (widget_class->priv->template->connect_data);
+  if (widget_class->priv->template->closure_data &&
+      widget_class->priv->template->closure_destroy)
+    widget_class->priv->template->closure_destroy (widget_class->priv->template->closure_data);
 
-  widget_class->priv->template->connect_func   = connect_func;
-  widget_class->priv->template->connect_data   = connect_data;
-  widget_class->priv->template->destroy_notify = connect_data_destroy;
+  widget_class->priv->template->closure_func    = closure_func;
+  widget_class->priv->template->closure_data    = closure_data;
+  widget_class->priv->template->closure_destroy = closure_data_destroy;
 }
 
 /**
index 49cf371cf4f3d3280cdbb91b0aa942e27f21c9dc..ff8ac40027fc4beaa4d13c84a69972fb1f5f2d07 100644 (file)
@@ -956,10 +956,10 @@ void    gtk_widget_class_bind_template_callback_full    (GtkWidgetClass        *
                                                          const gchar           *callback_name,
                                                          GCallback              callback_symbol);
 GDK_AVAILABLE_IN_ALL
-void    gtk_widget_class_set_connect_func               (GtkWidgetClass        *widget_class,
-                                                         GtkBuilderConnectFunc  connect_func,
-                                                         gpointer               connect_data,
-                                                         GDestroyNotify         connect_data_destroy);
+void    gtk_widget_class_set_closure_func               (GtkWidgetClass        *widget_class,
+                                                        GtkBuilderClosureFunc  closure_func,
+                                                         gpointer               closure_data,
+                                                         GDestroyNotify         closure_destroy);
 GDK_AVAILABLE_IN_ALL
 void    gtk_widget_class_bind_template_child_full       (GtkWidgetClass        *widget_class,
                                                          const gchar           *name,